package com.rambler.common.response;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 通用响应封装类，用于标准化 API 返回结果
 * 支持链式调用，如：CommonResponse.success().data(obj)
 */
@Data
@Accessors(chain = true)
public class CommonResponse<T> {

    /**
     * 状态码
     */
    private int code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 数据内容
     */
    private T data;

    /**
     * 成功响应（默认 200）
     */
    public static <T> CommonResponse<T> success() {
        return new CommonResponse<T>()
                .setCode(200)
                .setMessage("操作成功");
    }

    public static <T> CommonResponse<T> success(String message, T data) {
        return new CommonResponse<T>()
                .setCode(200)
                .setMessage(message)
                .setData(data);
    }

    public static <T> CommonResponse<T> success(T data) {
        return new CommonResponse<T>()
                .setCode(200)
                .setMessage("查询成功")
                .setData(data);
    }

    /**
     * 成功响应（自定义消息）
     */
    public static <T> CommonResponse<T> success(String message) {
        return new CommonResponse<T>()
                .setCode(200)
                .setMessage(message);
    }

    /**
     * 失败响应（默认 500）
     */
    public static <T> CommonResponse<T> failure() {
        return new CommonResponse<T>()
                .setCode(500)
                .setMessage("操作失败");
    }

    /**
     * 失败响应（自定义消息）
     */
    public static <T> CommonResponse<T> failure(String message) {
        return new CommonResponse<T>()
                .setCode(500)
                .setMessage(message);
    }

    /**
     * 自定义状态响应
     */
    public static <T> CommonResponse<T> of(int code, String message) {
        return new CommonResponse<T>()
                .setCode(code)
                .setMessage(message);
    }

    /**
     * 设置数据内容
     */
    public CommonResponse<T> data(T data) {
        this.setData(data);
        return this;
    }
}
